使用平移操纵器

使用平移操纵器可以使用户在 Kanzi 应用程序中移动节点。例如,您可以使用平移操纵器让用户移动图形。请参阅为节点启用平移手势

使用 平移操纵器 (Pan Manipulator) 触发器响应平移手势。例如,您可以设置用户平移节点时的节点外观。请参阅使用平移操纵器 (Pan Manipulator) 触发器

平移操纵器是一种输入操纵器,您可以用于在 Kanzi 应用程序中添加手势识别到节点上。 您可以通过 Kanzi Engine API 分配输入操纵器。请参阅使用输入操纵器

通过完成教程学习如何使用平移操纵器。请参阅教程:平移、缩放、轻敲

为节点启用平移手势

要为节点启用平移手势:

  1. Kanzi Studio 中使用应用程序 (Application) 模板创建工程。
  2. 工程 (Project) 中创建要启用平移手势的节点。
    例如,创建一个图像 (Image) 节点并将其命名为 PanNode

  3. 工程 (Project) 中选择您在上一步中创建的节点,在属性 (Properties) 中添加可测试命中 (Hit Testable) 属性,并将其设置为启用。
    当您启用属性时,用户能选取节点。
    默认情况下,按钮 (Button)列表框项容器 (List Box Item Container)滚动视图 (Scroll View)滑块 (Slider) 节点启用命中测试。 请参阅定义哪个节点接收用户输入
  4. 工程 (Project)按下 Alt 并右键点击 您创建的节点并选择别名 (Alias)
    Kanzi Studio 会创建一个别名(它指向您从中创建该别名的节点),并将该别名添加到它的含资源字典的最近祖先节点的资源字典中。
    使用 # 符号后跟别名名称访问别名目标节点。
  5. 选择文件 (File) > 导出 (Export) > 导出 KZB (Export KZB)
    Kanzi StudioKanzi Studio 工程创建 kzb 文件和配置文件。Kanzi Studio 将导出的文件存储在 <ProjectName>/Application/bin 目录或您在 工程 (Project) > 属性 (Properties)二进制导出目录 (Binary Export Directory) 属性中指定的位置。Kzb 文件包含 Kanzi Studio 工程中的所有节点和资源,您在本地化表中标记为本地化包的资源除外。
    当您从 Visual Studio 中运行您的 Kanzi 应用程序时,您的应用程序就会加载 kzb 文件和配置文件。
  6. 在 Visual Studio 中打开存储在 <ProjectName>/Application/configs/platforms/win32 中的解决方案,并在实现应用程序逻辑的文件中创建并配置平移操纵器:
    1. 为平移消息定义处理程序。
      例如,在实现应用程序逻辑的类的 public 部分后添加:
      private: 
      
          // 为 PanManipulator::StartedMessage 消息定义处理程序,该消息来自
          //具有可生成平移消息的输入操纵器的 2D 节点。
          //此处理程序可为平移手势准备 2D 节点。
          void onPanStarted(PanManipulator::StartedMessageArguments& messageArguments)
          {
              //从消息参数获得用户平移的节点。
              Node2DSharedPtr node2d = dynamic_pointer_cast<Node2D>(messageArguments.getSource());
      
              if (!node2d)
              {
                  return;
              }
      
              //当开始节点上的平移手势,让节点位于前面。
              node2d->moveToFront();
          }
      
          //为 PanManipulator::MovedMessage 消息定义处理程序,该消息来自
          //具有可生成平移消息的输入操纵器的 2D 节点。
          //此处理程序按平移手势的量变换 2D 节点。
          void onPanMoved(PanManipulator::MovedMessageArguments& messageArguments)
          {
              //从消息参数获得用户平移的节点。
              Node2DSharedPtr node2d = dynamic_pointer_cast<Node2D>(messageArguments.getSource());
      
              if (!node2d)
              {
                  return;
              }
      
              //获得自平移手势序列中上一条消息以来
              //平移的像素距离。
              Vector2 translationDelta = messageArguments.getDelta();
      
              //获得节点的渲染变换 (Render Transformation) 属性。
              SRTValue2D nodeTransform = node2d->getRenderTransformation();
      
              //获得节点的大小。
              Vector2 nodeSize = node2d->getActualSize();
      
              //获得节点的当前变换。
              Vector2 translation = nodeTransform.getTranslation();
      
              //从平移消息应用变换。
              Vector2 translationTarget = translation - translationDelta;
      
              //设置新变换。
              nodeTransform.setTranslation(translationTarget);
      
              //应用新变换到节点。
              node2d->setRenderTransformation(nodeTransform);
          }
    2. onProjectLoaded() 函数中创建 PanManipulator 操纵器并订阅其消息。
      例如,添加:
          virtual void onProjectLoaded() KZ_OVERRIDE
          {
              ScreenSharedPtr screen = getScreen();
              Domain* domain = getDomain();
      
              //使用别名获取PanNode。
              NodeSharedPtr panNode = screen->lookupNode<Node>("#PanNode");
      
              //创建生成平移消息的输入操纵器。
              PanManipulatorSharedPtr panManipulator = PanManipulator::create(domain);
      
              //设置水平和垂直轴的阈值(以像素为单位),
              //在输入操纵器识别平移手势之前,手指或鼠标需要移动轴。
              panManipulator->setRecognitionThreshold(Vector2(10.0f, 10.0f));
       
              //添加输入操纵器到PanNode。
              panNode->addInputManipulator(panManipulator);
      
              //订阅PanNodePanManipulator::StartedMessage 消息。
              // PanManipulator 在用户点击或触摸附加节点时生成此消息。
              panNode->addMessageHandler(PanManipulator::StartedMessage, bind(&MyProject::onPanStarted, this, placeholders::_1));
      
              //订阅 PanNodePanManipulator::MovedMessage 消息。
              //当用户在水平或垂直轴上移动手指或鼠标超过识别阈值时,PanManipulator 
              //首次生成此消息,然后
              //当手指或鼠标在更新之间移动时生成此消息。
              panNode->addMessageHandler(PanManipulator::MovedMessage, bind(&MyProject::onPanMoved, this, placeholders::_1));
          }
  7. 构建和运行应用程序。 请参阅部署 Kanzi 应用程序
    在应用程序中点击并拖动或轻敲并拖动已启用平移手势的节点。

使用平移操纵器 (Pan Manipulator) 触发器

使用 平移操纵器 (Pan Manipulator) 触发器响应平移手势。例如,您可以设置用户平移节点时的节点外观。

平移操纵器 (Pan Manipulator) 有这些触发器:

要使用平移操纵器 (Pan Manipulator) 触发器:

  1. 为节点启用平移手势。请参阅为节点启用平移手势
  2. 定义您想通过平移操纵器 (Pan Manipulator) 触发器设置的行为。
    例如,创建状态机,您可以定义状态以设置节点在平移已启动 (Pan Started)平移已移动 (Pan Moved)平移已完成 (Pan Finished) 触发器被触发时的外观。请参阅创建状态机
  3. 添加和配置平移操纵器 (Pan Manipulator) 触发器:
    1. 工程 (Project) 中,选择要为其添加触发器的节点,并在节点组件 (Node Components) > 触发器 (Triggers) 部分添加其中一个平移操纵器 (Pan Manipulator) 触发器。
      例如,在工程 (Project) 中选择启用平移手势的节点,并在节点组件 (Node Components) 中添加平移已启动 (Pan Started) 触发器。
    2. 在您在上一步创建的触发器中,点击 触发器设置 (Trigger Settings) 并在 触发器设置编辑器 (Trigger Settings Editor) 中禁用 设置已处理消息 (Set Message Handled) 属性。
      当您禁用 设置已处理消息 (Set Message Handled) 属性,此触发器拦截消息,但不会停止消息。这样您可以让输入操纵器处理该消息。
    3. 在您创建的触发器中,选择 添加 (Add) 下拉菜单中的动作,并配置该动作。
      例如,选择转到状态 (Go to State) 动作并在动作设置中设置:
      • 项 (Item) 设为要启用平移手势的节点
      • 状态 (State) 设为设置节点在平移已启动 (Pan Started) 触发器被触发时的外观的状态
  4. 重复上一步,以添加并配置更多平移操纵器 (Pan Manipulator) 触发器。
    例如,添加平移已移动 (Pan Moved)平移已完成 (Pan Finished) 触发器。在每个触发器的转到状态 (Go to State) 动作中,将状态 (State) 设置为将在触发器被触发时会设置节点外观的状态。
  5. 选择文件 (File) > 导出 (Export) > 导出 KZB (Export KZB)
  6. 构建和运行应用程序。 请参阅部署 Kanzi 应用程序
    在应用程序中点击并拖动或轻敲并拖动已启用平移手势的节点。

在 API 中使用平移操纵器

有关详细信息,请参阅 API reference中的 PanManipulator 类。

另请参阅

教程:平移、缩放、轻敲

处理用户输入

使用捏合操纵器

使用滚动视图 (Scroll View) 节点

部署 Kanzi 应用程序

使用触发器